Implement network.get_VIFs.
authorEwan Mellor <ewan@xensource.com>
Thu, 28 Dec 2006 12:26:29 +0000 (12:26 +0000)
committerEwan Mellor <ewan@xensource.com>
Thu, 28 Dec 2006 12:26:29 +0000 (12:26 +0000)
Signed-off-by: Ewan Mellor <ewan@xensource.com>
tools/python/xen/xend/XendDomain.py
tools/python/xen/xend/XendDomainInfo.py
tools/python/xen/xend/XendNetwork.py
tools/python/xen/xend/XendNode.py
tools/python/xen/xend/XendPIF.py

index d0cb8cfabb1a5b8bd4b66e39ef2c940a20aa0632..6ea6ae075b868ff994b59c7b533cd1bfae8515c7 100644 (file)
@@ -605,6 +605,16 @@ class XendDomain:
         finally:
             self.domains_lock.release()
 
+    def get_all_vms(self):
+        self.domains_lock.acquire()
+        try:
+            result = self.domains.values()
+            result += [x for x in self.managed_domains.values() if
+                       x not in result]
+            return result
+        finally:
+            self.domains_lock.release()
+
     def get_vm_by_uuid(self, vm_uuid):
         self.domains_lock.acquire()
         try:
index e66bf89915a738e0141d6ade5f6040436d8d564e..a92b706986af7e63a7262b123fd98310ce901cb4 100644 (file)
@@ -1967,8 +1967,12 @@ class XendDomainInfo:
                     config['device'] = 'eth%d' % devid
                 else:
                     config['device'] = ''
-                    
-            config['network'] = '' # Invalid for Xend
+
+            if not config.has_key('network'):
+                config['network'] = \
+                    XendNode.instance().bridge_to_network(
+                    config.get('bridge')).uuid
+
             config['MTU'] = 1500 # TODO
             config['io_read_kbs'] = 0.0
             config['io_write_kbs'] = 0.0
index 42d421d5ebfca6cdabb138822161f2efcfe31f34..be0d5cedd56db74ce9182672cbec57da7e2498df 100644 (file)
@@ -21,6 +21,7 @@ import re
 import struct
 import socket
 
+import XendDomain
 import XendNode
 from XendLogging import log
 
@@ -83,7 +84,15 @@ class XendNetwork:
             XendNode.instance().save_networks()
 
     def get_VIF_UUIDs(self):
-        return []
+        result = []
+        vms = XendDomain.instance().get_all_vms()
+        for vm in vms:
+            vifs = vm.get_vifs()
+            for vif in vifs:
+                vif_cfg = vm.get_dev_xenapi_config('vif', vif)
+                if vif_cfg['network'] == self.uuid:
+                    result.append(vif)
+        return result
 
     def get_PIF_UUIDs(self):
         return [x.uuid for x in XendNode.instance().pifs.values()
index 1d900f124e701456642ccd528145282c1b06cf17..ccbcdd30fba0aec1a6c90125685d91c97c5e3733 100644 (file)
@@ -289,6 +289,22 @@ class XendNode:
     def get_network(self, network_ref):
         return self.networks[network_ref]
 
+    def bridge_to_network(self, bridge):
+        if not bridge:
+            rc, bridge = commands.getstatusoutput(
+                'brctl show | cut -d "\n" -f 2 | cut -f 1')
+            if rc != 0 or not bridge:
+                raise Exception(
+                    'Could not find default bridge, and none was specified')
+
+        bridges = Brctl.get_state()
+        if bridge not in bridges:
+            raise Exception('Bridge %s is not up' % bridge)
+        for pif in self.pifs.values():
+            if pif.interface_name() in bridges[bridge]:
+                return pif.network
+        raise Exception('Bridge %s is not connected to a network' % bridge)
+
 
     #
     # Getting host information.
index b4b0e973bee70e8498531d66144d4a286df74d35..aea03e0b165448297c0ee3be63bffd62757a3f40 100644 (file)
@@ -134,7 +134,7 @@ class XendPIF:
 
 
     def refresh(self, bridges):
-        ifname = self._ifname()
+        ifname = self.interface_name()
         rc, _ = _cmd('ip link show %s', ifname)
         if rc != 0:
             # Interface does not exist.  If it's a physical interface, then
@@ -172,7 +172,7 @@ class XendPIF:
         log.info('Added network interface %s to bridge %s', ifname, brname)
 
 
-    def _ifname(self):
+    def interface_name(self):
         if self.vlan:
             return '%s.%s' % (self.name, self.vlan)
         else: